#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#


cmake_minimum_required(VERSION 2.8)

project(thrift-compiler)

set(PACKAGE_VERSION "1.0.0")

message(STATUS "Thrift package version: ${PACKAGE_VERSION}")

# These are internal to CMake
string(REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+)(-dev)?" "\\1" thrift_VERSION ${PACKAGE_VERSION})
string(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" thrift_VERSION_MAJOR ${thrift_VERSION})
string(REGEX REPLACE "[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" thrift_VERSION_MINOR ${thrift_VERSION})
string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" thrift_VERSION_PATCH ${thrift_VERSION})
message(STATUS "Thrift version: ${thrift_VERSION} (${thrift_VERSION_MAJOR}.${thrift_VERSION_MINOR}.${thrift_VERSION_PATCH})")

# Windows has a different header
if(MSVC)
    set(FLEX_FLAGS "--nounistd") # Don't use unistd.h on windows
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/windows/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
else()
    set(FLEX_FLAGS " ")
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
endif()

find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)

# Create flex and bison files and build the lib parse static library
BISON_TARGET(thrifty ${CMAKE_CURRENT_SOURCE_DIR}/src/thrifty.yy ${CMAKE_CURRENT_BINARY_DIR}/thrifty.cc)
FLEX_TARGET(thriftl ${CMAKE_CURRENT_SOURCE_DIR}/src/thriftl.ll ${CMAKE_CURRENT_BINARY_DIR}/thriftl.cc COMPILE_FLAGS ${FLEX_FLAGS})
ADD_FLEX_BISON_DEPENDENCY(thriftl thrifty)

# HACK: Work around the fact that bison crates a .hh file but we need a .h file
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/thrifty.h
                   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/thrifty.hh ${CMAKE_CURRENT_BINARY_DIR}/thrifty.h
                   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/thrifty.hh
                   )

set(libparse_SOURCES
    ${CMAKE_CURRENT_BINARY_DIR}/thrifty.cc
    ${CMAKE_CURRENT_BINARY_DIR}/thriftl.cc
    ${CMAKE_CURRENT_BINARY_DIR}/thrifty.h
)

add_library(libparse STATIC ${libparse_SOURCES})

# Create the thrift compiler
set( thrift_SOURCES 
    src/main.cc
    src/md5.c
    src/generate/t_generator.cc
    src/generate/t_generator_registry.h
    src/globals.h
    src/main.h
    src/platform.h
    src/md5.h
    src/parse/t_doc.h
    src/parse/t_type.h
    src/parse/t_base_type.h
    src/parse/t_enum.h
    src/parse/t_enum_value.h
    src/parse/t_typedef.h
    src/parse/t_typedef.cc
    src/parse/t_container.h
    src/parse/t_list.h
    src/parse/t_set.h
    src/parse/t_map.h
    src/parse/t_struct.h
    src/parse/t_field.h
    src/parse/t_service.h
    src/parse/t_function.h
    src/parse/t_program.h
    src/parse/t_scope.h
    src/parse/t_const.h
    src/parse/t_const_value.h
    src/parse/parse.cc
    src/generate/t_generator.h
    src/generate/t_oop_generator.h
    src/windows/config.h
    version.h
)

# This macro adds an option THRIFT_COMPILER_${NAME}
# that allows enabling or disabling certain languages
macro(THRIFT_ADD_COMPILER name description initial)
    string(TOUPPER "THRIFT_COMPILER_${name}" enabler)
    set(src "src/generate/t_${name}_generator.cc")
    option(${enabler} ${description} ${initial})
    if(${enabler})
        list(APPEND thrift_SOURCES ${src})
    endif()
endmacro()

# The following compiler can be enabled or disabled

THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" ON)
THRIFT_ADD_COMPILER(py      "Enable compiler for Python 2.0" ON)
THRIFT_ADD_COMPILER(go      "Enable compiler for Go" ON)

# Thrift is looking for include files in the src directory
# we also add the current binary directory for generated files
include_directories(${CMAKE_CURRENT_BINARY_DIR} src)

add_executable(thrift ${thrift_SOURCES})

target_link_libraries(thrift libparse)

install(TARGETS thrift DESTINATION bin)


if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic")
endif()


# create a Distribution Package for the Apache Thrift Compiler
set(CPACK_PACKAGE_NAME "Apache Thrift")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache Thrift Compiler")
set(CPACK_PACKAGE_VENDOR "Apache Software Foundation" )
set(CPACK_PACKAGE_CONTACT "dev@thrift.apache.org")
set(CPACK_PACKAGE_VERSION ${thrift_VERSION})
set(CPACK_PACKAGE_VERSION_MAJOR ${thrift_VERSION_MAJOR} )
set(CPACK_PACKAGE_VERSION_MINOR ${thrift_VERSION_MINOR} )
set(CPACK_PACKAGE_VERSION_PATCH ${thrift_VERSION_PATCH} )
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")

if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
    set(CPACK_GENERATOR "NSIS")
    set(CPACK_NSIS_HELP_LINK "http://thrift.apache.org")
    set(CPACK_NSIS_MENU_LINKS
        "http://thrift.apache.org" "Apache Thrift - Web Site"
        "https://issues.apache.org/jira/browse/THRIFT" "Apache Thrift - Issues")
    set(CPACK_NSIS_CONTACT ${CPACK_PACKAGE_CONTACT})
    set(CPACK_NSIS_MODIFY_PATH "ON")
    set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
else()
    set(CPACK_GENERATOR "DEB" )
    set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_CONTACT})
endif()
include(CPack)
